#ifndef __FFHTTPD_H_
#define __FFHTTPD_H_

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <signal.h>

typedef int (*PFN_CGI_MAIN)(char *request_type, char *request_path, char *url_args, char *request_data, int request_size, char *content_type, int ctypebuf_size, char *page_buf, int pbuf_size);

#include <unistd.h>
#include <errno.h>
#include <dlfcn.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

#define FFHTTPD_MAX_CONNECTIONS 8
#define FFHTTPD_MAX_WORK_THREADS FFHTTPD_MAX_CONNECTIONS

typedef struct
{
	int head;									 // 表示线程池中连接的头部位置 新连接总是添加到这个位置
	int tail;									 // 表示线程池中连接的尾部位置 从这里开始处理已存在的连接
	int size;									 // 表示线程池中当前的连接数  当它等于-1时,表示线程池应退出
	int conns[FFHTTPD_MAX_CONNECTIONS];			 // 这是一个套接字数组,存储了线程池中的所有连接.其索引为head的值表示下一个要接收的连接,而索引为tail的值表示下一个要处理的连接.
	pthread_mutex_t mutex;						 // POSIX线程互斥锁,用于保护线程池的访问.它用于防止多个线程同时修改线程池的状态.
	pthread_cond_t cond;						 // POSIX线程条件变量,用于线程池的同步.当新连接到达且有空闲线程时,它用于通知等待的线程.
	pthread_t threads[FFHTTPD_MAX_WORK_THREADS]; // POSIX线程数组,存储了线程池中的所有工作线程.每个线程都从tail开始处理连接,并在处理完一个连接后移动到下一个连接.
} THEADPOOL;

char *my_strlwr(char *s);
char *parse_params(char *str, const char *key, char *val, int len);
void get_file_range_size(char *file, int *start, int *end, int *size);
void send_file_data(int fd, char *file, int start, int end);

void threadpool_init(THEADPOOL *tp);
void threadpool_free(THEADPOOL *tp);
int threadpool_dequeue(THEADPOOL *tp);
void threadpool_enqueue(THEADPOOL *tp, int fd);

void *handle_http_request(void *argv);

extern char g_root_path[256];
extern int g_server_port;
extern int g_exit_server;

#endif